package com.bdqn.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * @Author 27435
 * @Date 2025/1/615:59
 * @Version 1.0
 */

@Controller
public class UploadController {

    @Autowired
    private ServletContext servletContext;

    /**
     *
     * @param file 上传的文件对象
     * @param model 模型数据
     * @param request 请求对象
     * @return
     */
    @RequestMapping("/up")
    public String fileUpload(MultipartFile file, Model model, HttpServletRequest request) throws IOException {
        // 处理文件上传
        String originalFilename = file.getOriginalFilename();  // 获取上传文件的名字
        // 使用UUID给文件重命名，并且去掉UUID的四个“-”
        String fileName = UUID.randomUUID().toString().replace("-", "");
        // 获取文件的后缀
        String exName = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 拼接新的文件名称
        String newFileName = fileName + exName;
        // 声明转存文件时，目标目录的虚拟路径（也就是浏览器访问服务器时，能够访问到这个目录的路径）
        String virtualPath = "/upload";
        // 准备转存文件时，目标目录的路径。File对象要求这个路径是一个完整的物理路径。
        // 而这个物理路径又会因为在服务器上部署运行时所在的系统环境不同而不同，所以不能写死。
        // 需要调用servletContext对象的getRealPath()方法，将目录的虚拟路径转换为实际的物理路径
        String realPath = servletContext.getRealPath(virtualPath);
        // 创建File类型的对用于文件转存
        File filePath = new File(realPath, newFileName);
        if (!filePath.getParentFile().exists()){
            // 如果文件夹不存在就新建一个
            filePath.getParentFile().mkdirs();
        }
        // 调用transferTo()方法实现文件转存  将上传文件复制到目标路径
        file.transferTo(filePath);
        // 为了让下一个页面能够将图片展示出来，将图片访问路径存入模型，把访问图片的路径准备好
        String picPath = servletContext.getContextPath() + "/upload/" + newFileName;
        System.out.println(picPath);
        model.addAttribute("filePath", picPath);
        return "success";
    }

}
